/*
 * @Author: your name
 * @Date: 2021-08-31 09:59:20
 * @LastEditTime: 2021-08-31 17:11:02
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \briup\5-javascript\day07\2-数组增删数据.js
 */

//concat是Array.prototype的实例方法
//Array.prototype.concat（另一个数组）返回值就是拼接后的数组 原数组不会受影响
//concat 功能：数据项的简单的一个层次的拼接
var arr = [100, 200];
var result1 = arr.concat(300);
var result2 = arr.concat('hello', 'world');
var result3 = arr.concat([1, 2, 3]);
console.log(arr, result1, result2, result3); //[ 100, 200 ] [ 100, 200, 300 ] [ 100, 200, 'hello', 'world' ] [ 100, 200, 1, 2, 3 ]


//slice是Array.prototype的实例方法
//Array.prototype.slice(index_start,index_end);
//slice:截取数据项 slice[index_start,index_end)=slice(x,y) 原数组不受影响
//slice(0)-->下标0到所有   slice(0,3):从下标0开始，往后的三个

//slice应用场景：1.深拷贝

var arr2 = [100, 200, 300, 400, 500];
var r4 = arr2; //简单的地址值的复制，浅拷贝，指向的同一片内存空间
var r1 = arr2.slice(0); //r1=arr2; 深拷贝，指向的不是同一内存空间,在栈和堆开辟了自己的空间
var r2 = arr2.slice(0, 3);
var r3 = arr2.slice(3, 5);
console.log(arr2, r1, r2, r3);
arr2.push(600);
console.log(arr2); //[ 100, 200, 300, 400, 500, 600 ] 
r1.pop();
console.log(r1); //[ 100, 200, 300, 400 ]
r4.pop();
console.log(r4); //[ 100, 200, 300, 400, 500]

//2.类数组对象，转换成 数组格式

function add() {
    console.log(arguments, arguments.length, arguments.callee);
    // var arr=arguments.slice(0);//error! arguments是对象，不能调用slice
    //所以反建立对象与函数之间的关系
    var arr = Array.prototype.slice.call(arguments);
    console.log(arr);
}
add(1, 2, 3, 4);
add('hello', 'world', 'briup');


//splice:删除、新增插入、替换

//Array.prototype.splice()   原数组发生改变，返回值是移除的项
//Array.prototype.splice(index_start,count); 删除

var arr3 = [100, 200, 300, 400];
var p1 = arr3.splice(1, 2);
console.log(arr3, p1); //[100,400]  [200,300]

var arr4 = [100, 200, 300, 400];
var p2 = arr4.splice(0, arr4.length); //深度拷贝，清空数组
console.log(arr4, p2); //[] [100,200,300,400]

var arr5 = [100, 200, 300, 400];
var p3 = arr5.splice(1, 0);
console.log(arr5, p3); //[100,200,300,400]  []

var arr6 = [100, 200, 300, 400];
var p4 = arr5.splice(7, 3); //数组下标没有到7，所以是删除不了值
console.log(arr6, p4); //[100,200,300,400] []

var arr7 = [100, 200, 300, 400];
var p5 = arr5.splice(-3, 3); //索引是负值，就是索引倒序查找 
//arr7[-1]=400 arr7[-2]=300 arr[-3]=200
//负着删除不会影响原数组，原数组不会改变
console.log(arr7, p5); //[100,200,300,400]  [200,300,400]


//Array.prototype.splice(index_start,count,新增的数据项是s);插入或者替换
var arr8 = [100, 200, 300, 400];
var p6 = arr8.splice(1, 2, 'a', 'b', 'c'); //替换
var arr9 = [100, 200, 300, 400];
var p7 = arr9.splice(1, 0, 'a', 'b', 'c'); //插入
console.log(arr8, p6); //[100,'a','b','c',400]   [200,300]
console.log(arr9, p7); //[100,'a','b','c',200,300,400]  []